package com.octopus.core;

/**
 * 封装爬虫下载响应信息。
 *
 * <p>响应信息包含http响应状态，以及二进制的http响应体。成功的响应内容会有爬虫引擎调用解析器进行解析。
 *
 * @see com.octopus.core.parser.Parser
 * @author shoulai.yang@gmail.com
 * @date 2019/07/31
 */
public class Response {

  /** 任务实体 */
  private Request request;

  /** http响应状态 */
  private int httpStatus;

  /** 响应内容编码 */
  private String charset;

  /** http二进制响应内容 */
  private byte[] body;

  private Response(Request request) {
    this.request = request;
  }

  /**
   * 由爬虫任务构建响应
   *
   * @param request 爬虫任务
   * @return 响应实体
   */
  public static Response me(Request request) {
    return new Response(request);
  }

  /**
   * 设置响应任务实体
   *
   * @param request 任务实体
   * @return 当前响应实体
   */
  public Response request(Request request) {
    this.request = request;
    return this;
  }

  /**
   * 获取响应任务实体
   *
   * @return 关联的任务实体
   */
  public Request request() {
    return this.request;
  }

  /**
   * 设置http响应状态
   *
   * @param httpStatus http status
   * @return http status, 一般200即认为下载成功。
   */
  public Response httpStatus(int httpStatus) {
    this.httpStatus = httpStatus;
    return this;
  }

  /**
   * 获取 http status
   *
   * @return http status
   */
  public int httpStatus() {
    return this.httpStatus;
  }

  /**
   * 设置二进制下载内容
   *
   * @param body 二进制下载内容
   * @return 当前响应实体对象
   */
  public Response body(byte[] body) {
    this.body = body;
    return this;
  }

  /**
   * 获取二进制下载内容
   *
   * @return 二进制下载内容
   */
  public byte[] body() {
    return this.body;
  }

  /**
   * 设置响应的编码
   *
   * @param charset 编码
   * @return 当前响应实体对象
   */
  public Response charset(String charset) {
    this.charset = charset;
    return this;
  }

  /**
   * 获取响应编码
   *
   * @return 编码
   */
  public String charset() {
    return this.charset;
  }

  @Override
  public String toString() {
    return "Response[Request = " + request + ", httpStatus = " + httpStatus + "]";
  }
}
